home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 1 / Cream of the Crop 1.iso / EDITOR / KDP32_1.ARJ / K24.C < prev    next >
Text File  |  1992-05-20  |  6KB  |  284 lines

  1. /*K24.C
  2.  
  3. FONT EDITOR FOR 24-DOT FONT FILES
  4. J.W. Stumpel, Tokyo, February 1992 */
  5.  
  6. #include <stdio.h>
  7. #include <dos.h>
  8. #include <conio.h>
  9. #include <process.h>
  10.  
  11. #define F1     0x3b
  12. #define F2     0x3c
  13. #define F3     0x3d
  14. #define R_ARROW  0x4d
  15. #define L_ARROW  0x4b
  16. #define UP_ARROW 0x48
  17. #define DN_ARROW 0x50
  18. #define    SPBAR     0x39
  19. #define ESC      0x01
  20. #define xstart     15    /*coordinates of left top*/
  21. #define ystart     4    /*of kanji display*/
  22. #define CURSOROFF cursor(40,40)
  23. #define CURSORON  cursor(6,7)
  24. #define byte       unsigned char
  25. #define word       unsigned int
  26. #define HIGHLIGHT 0x1e        /*Yellow on blue; attr of header & footer line*/
  27.  
  28. byte kanji_attr[6]={0x1E,0x3E,0x1E,0x3E,0x1E,0x3E};
  29. typedef struct {
  30.         byte b[24][3];
  31.         } kanji;
  32.  
  33. int maxrow=83;
  34. byte mask[8]={128,64,32,16,8,4,2,1};
  35. kanji charbuf;           /*buffer for one character. For copying.*/
  36. kanji thiskanji;         /*kanji being edited*/
  37. byte far *keybyte=MK_FP(0x40,0x17);  /*PC keyboard status byte*/
  38. FILE *fp;
  39.  
  40. char *instr[5]= { "SPACE  change pixel",
  41.           "F1     put char in buffer",
  42.                   "F2     copy buffer to char",
  43.              "F3     save this char to disk",
  44.           "ESC    exit"};
  45.  
  46. void paint_character (int,int);
  47. void symbol(int x, int y);
  48. void cursor(int start, int end);
  49. void movecursor(int x,int y);
  50. char getkey(int *k);
  51. void doexit (char *s,int endcode);
  52. void initialize(char *);
  53. void showhex(int y);
  54. word sjis(int ku, int ten);
  55. void beep(void);
  56. void erbar(char *);
  57. void readkanji(int,int);
  58. void savekanji(int,int);
  59.  
  60. char * usage= "Font editor for 24 x 24 JIS files"
  61.           "\nUsage: K24 <fontfilename>";
  62.  
  63.  
  64.  
  65.  
  66.  
  67. main(int argc,char *argv[])
  68. {
  69.  
  70. int x=0,y=0,i,j,k;
  71. int ku=1,ten=1;
  72. if (argc!=2)     {
  73.         printf("%s",usage);
  74.         exit(1);
  75.         }
  76. initialize(argv[1]);
  77. textattr(HIGHLIGHT);
  78. readkanji(ku,ten);
  79. paint_character(ku,ten);
  80. do    {
  81.     movecursor(x,y);
  82.     getkey(&k);
  83.     if(*keybyte&3)  /*test for left or right shift pressed*/
  84.        {
  85.        switch(k)
  86.          {
  87.          case L_ARROW:    if (ten==1) ten=95; ten--; break;
  88.          case R_ARROW:    if (ten==94) ten=0; ten++; break;
  89.          case UP_ARROW:    if (ku>1) ku--;          break;
  90.          case DN_ARROW:    if (ku<maxrow) ku++;       break;
  91.              }
  92.        readkanji(ku,ten);
  93.        paint_character(ku,ten);
  94.        }
  95.     else switch(k)
  96.          {
  97.          case L_ARROW:      if (x>0)  x--;  break;
  98.          case R_ARROW:      if (x<23) x++;  break;
  99.          case UP_ARROW:     if (y>0)  y--;  break;
  100.          case DN_ARROW:     if (y<23) y++;  break;
  101.          case SPBAR:        thiskanji.b[y][x/8] ^=mask[x&7];
  102.                 symbol(x,y);
  103.                 showhex(y);
  104.                     break;
  105.          case F1:        for (j=0;j<24;j++)
  106.                 for (i=0;i<3;i++)
  107.                     charbuf.b[j][i]=thiskanji.b[j][i];
  108.                 beep();
  109.                 break;
  110.          case F2:        for (j=0;j<24;j++)
  111.                 for (i=0;i<3;i++)
  112.                     thiskanji.b[j][i]=charbuf.b[j][i];
  113.                 paint_character(ku,ten);
  114.                 beep();
  115.                 break;
  116.          case F3:        savekanji(ku,ten);
  117.                 beep();
  118.                 break;
  119.         }
  120.     }
  121.     while (k!=ESC);
  122. if (fclose(fp)) erbar ("Error closing file!");
  123. doexit("",0);
  124. }
  125.  
  126.  
  127.  
  128.  
  129. void erbar(char *s)
  130. /*display red error bar with message. User must type ESC*/
  131. {
  132. int k;
  133. beep();
  134. textattr(0xcf);
  135. gotoxy(40,14);
  136. cprintf(s);
  137. while (getkey(&k)!=0x1b);
  138. textattr(0x7);
  139. gotoxy(40,14);
  140. cprintf("                               "); /*erase error bar*/
  141. }
  142.  
  143. void initialize(char *filename)
  144. {
  145. int j;
  146. fp=fopen(filename,"r+b");
  147. if (!fp) erbar("Error opening file");
  148. textattr(7);
  149. clrscr();
  150. CURSOROFF;
  151. textattr(HIGHLIGHT);
  152. gotoxy(1,1);
  153. cprintf(    "                          24x24 dot Kanji"
  154.         " Font Editor                           ");
  155. gotoxy(1,25);
  156. cprintf(    " Arrows: move around in image           "
  157.         "     Shift-arrows: move around in table");
  158. textattr(7);
  159. gotoxy(xstart+24,ystart-1);
  160. cprintf("  (top)  (bottom)");
  161. for (j=0;j<5;j++) {
  162.            gotoxy(20,19+j);
  163.            cprintf(instr[j]);
  164.            }
  165. }
  166.  
  167. void doexit (char *s,int endcode)
  168. /* To finish the program neatly*/
  169. {
  170. window(1,1,80,25);
  171. textattr(7);
  172. clrscr();
  173. cprintf(s); /*print a sign-off message*/
  174. CURSORON;
  175. exit(endcode); /*code accessible from batch files*/
  176. }
  177.  
  178.  
  179. char getkey(int *k)
  180. /*Reads the next key in the keyboard buffer and returns it in
  181.   the argument k. */
  182. {
  183. _AH=0;
  184. geninterrupt(0x16);
  185. _CX=_AX;  /*turns out to be necessary*/
  186. *k=_AH;
  187. return (_CL);
  188. }
  189.  
  190. void beep(void)
  191. {
  192. sound(2400);
  193. delay(50);
  194. nosound();
  195. }
  196.  
  197. void cursor(int start, int end)
  198. {
  199. _AH=1;
  200. _CH=start;
  201. _CL=end;
  202. geninterrupt(0x10);
  203. }
  204.  
  205. void showhex(int y)
  206. {
  207. y&=0xFFFE;
  208. gotoxy(xstart+26,y/2+ystart);
  209. textattr(0x3E);
  210. cprintf("%02X%02X%02X  %02X%02X%02X",thiskanji.b[y][0],
  211.                                  thiskanji.b[y][1],
  212.                             thiskanji.b[y][2],
  213.                      thiskanji.b[y+1][0],
  214.                              thiskanji.b[y+1][1],
  215.                             thiskanji.b[y+1][2]);
  216. }
  217.  
  218. void symbol(int x, int y)
  219. {
  220. int top,bottom;
  221. y/=2;
  222.  
  223. /*determine value of two pixels at the same time*/
  224. top    =((thiskanji.b[2*y][x/8]&mask[x&7])!=0)? 1:0;
  225. bottom    =((thiskanji.b[2*y+1][x/8]&mask[x&7])!=0)? 1:0;
  226. gotoxy(x+xstart,y+ystart);
  227. textattr (kanji_attr[x/4]);
  228. switch(top+2*bottom)
  229.    {
  230.    case 0: putch(' ');    break;
  231.    case 1: putch(223);    break;
  232.    case 2: putch(220);    break;
  233.    case 3: putch(219);    break;
  234.    }
  235. }
  236.  
  237. void paint_character (int ku, int ten)
  238. {
  239. int x,y;
  240. CURSOROFF;
  241. for (y=0;y<24;y+=2)
  242.     {
  243.     for (x=0;x<24;x++) symbol(x,y);
  244.     showhex(y);
  245.     }
  246. gotoxy(23,16);
  247. textattr(7);
  248. cprintf("ku=%2u, ten=%2u (sjis: %4X)",ku,ten,sjis(ku,ten));
  249. }
  250.  
  251. word sjis(int ku, int ten)
  252. {
  253. word high,low;
  254. high=0x80+(ku+1)/2 ;         /* 2 ku values share the same high byte. */
  255.   if (high>0x9F) high+=0x40;  /* if outside 81-9F range, lift to E0-EA range*/
  256.   if (ku&1)  {                /* ku is odd*/
  257.                low= 0x3F+ten;
  258.                if (low>=0x7F) low++;
  259.              }
  260.   else         low= 0x9E+ten;   /* ku is even */
  261. return (256*high+low);
  262. }
  263.  
  264. void movecursor (int x,int y)
  265. {
  266. gotoxy(x+xstart,y/2+ystart);
  267. if (y&1) cursor(5,8);  /*bottom half*/
  268.     else cursor(1,4);  /*top half*/
  269. }
  270.  
  271.  
  272. void readkanji(int ku, int ten)
  273. {
  274. fseek(fp,(long)sizeof(kanji)*((ku-1)*94+ten-1),SEEK_SET);
  275. if (fread(&thiskanji,sizeof(kanji),1,fp)!=1)
  276.     erbar("Read error!");
  277. }
  278.  
  279. void savekanji(int ku,int ten)
  280. {
  281. fseek(fp,(long)sizeof(kanji)*((ku-1)*94+ten-1),SEEK_SET);
  282. if (fwrite(&thiskanji,sizeof(kanji),1,fp)!=1)
  283.     erbar("Write error!");
  284. }